#include "parsefiles.h"
#include "QTextStream"

ParseFiles::ParseFiles(QString& type)
{
    _type = type;
}
int ParseFiles::RunParse(){

    QString p1 = "";
    QString p2 = "";
    //=============================================
    if(_type == "HTML"){
        p1 = QString(":/resource/resource/Rjev.html");
        p2 = QString(":/resource/resource/Riga.html");
    }
    else if(_type == "TXT"){
        //p1 = QString(":/resource/resource/rgev.txt");
        //p2 = QString(":/resource/resource/rig.txt");
        p1 = QString(":/resource/resource/NRjev.txt");
        p2 = QString(":/resource/resource/NRig.txt");
    }
    else{
        return Error2("Тип неверен!", FILEFUNKLINE);
    }
    //==============================================
    if(p1.isNull() || p1.isEmpty() || p2.isNull()|| p2.isEmpty()){
        Error2("11 строка", FILEFUNKLINE);
        return -1;
    }
    QFile fileSt1(p1);
    if (!fileSt1.open(QIODevice::ReadOnly)){
        Error2("18 строка", FILEFUNKLINE);
        return -1;
    }
    QFile fileSt2(p2);
    if (!fileSt2.open(QIODevice::ReadOnly)){
        Error2("22 строка", FILEFUNKLINE);
        return -1;
    }
    //=============================================
    if(_type == "HTML"){
        return ParsingHtml(fileSt1, fileSt2);
    }
    else if(_type == "TXT"){
        return ParsingTxt(fileSt1, fileSt2);
    }
    else{
        CloseFiles(fileSt1, fileSt2);
        return Error2("Тип неверен!", FILEFUNKLINE);
    }
    //==============================================

}
void ParseFiles::CloseFiles(QFile& f1, QFile& f2){
    f1.close();
    f2.close();
}
//Разбор текстовых файлов
int ParseFiles::ParsingTxt(QFile& fileSt1, QFile& fileSt2) {
    QList<Elka> *spisok1St = nullptr;
    QList<Elka> *spisok2St = nullptr;

    if(ParseFileZapSpiska(spisok1St, fileSt1) != 0){
        CloseFiles(fileSt1, fileSt2);
        return Error2("Функция ParseFileZapSpiska(spisok1St, fileSt1) вернула ошибку.", FILEFUNKLINE);
    }
    if(ParseFileZapSpiska(spisok2St, fileSt2) != 0){
        CloseFiles(fileSt1, fileSt2);
        return Error2("Функция ParseFileZapSpiska(spisok2St, fileSt2) вернула ошибку.", FILEFUNKLINE);
    }

    //Время сейчас
    QTime now = QTime::currentTime();
    if(ViborElki(spisok1St, spisok2St, now, 0) != 0){
        CloseFiles(fileSt1, fileSt2);
        return Error2("Функция ViborElki вернула ошибку.", FILEFUNKLINE);
    }
    //Через 5 минут
    QTime t5 = now.addSecs(5 * 60);
    if(ViborElki(spisok1St, spisok2St, t5, 5) != 0){
        CloseFiles(fileSt1, fileSt2);
        return Error2("Функция ViborElki вернула ошибку.", FILEFUNKLINE);
    }
    //Через 10 минут
    QTime t10 = now.addSecs(10 * 60);
    if(ViborElki(spisok1St, spisok2St, t10, 10) != 0){
        CloseFiles(fileSt1, fileSt2);
        return Error2("Функция ViborElki вернула ошибку.", FILEFUNKLINE);
    }

    fileSt1.close();
    fileSt2.close();

    return 0;
}
int ParseFiles::ParseFileZapSpiska(QList<Elka>*& spisok1St, QFile& fileSt1){
    //Парсинг первого файла
    QTextStream in(&fileSt1);
    spisok1St = new QList<Elka>();
    int numline = 0;
    while (!in.atEnd()) {
        QString line = in.readLine();
        numline++;
        if(numline > 2){
            Elka *elka = new Elka();
            spisok1St->append(*elka);
            if(ParseLine(line, spisok1St->last()) != 0){
                return Error2("ParseLine вернула ошибку.", FILEFUNKLINE);
            }
        }
    }
    return 0;
}
int ParseFiles::ViborElki(QList<Elka>*& spisok1St,QList<Elka>*& spisok2St, QTime& time, int interv){
    //Сравнение и получение порядкового номера для списков
    int num1 = 0;
    int num2 = 0;
    for(int i = 0; i < spisok1St->size(); i++){
        if(spisok1St->at(i).timeOtpr < time) num1++;
        else break;
    }    
    if(num1 == spisok1St->size()){
        num1 = 0;
    }
    else if(num1 > spisok1St->size()){
        Error1("Ошибка размерности. (num1)");
    }
    //Второй список
    for(int i = 0; i < spisok2St->size(); i++){
        if(spisok2St->at(i).timeOtpr < time) num2++;
        else break;
    }
    if(num2 == spisok2St->size()){
        num2 = 0;
    }
    else if(num2 > spisok2St->size()){
        Error1("Ошибка размерности. (num2)");
    }

    Error1((QString::number(interv) + " минут.\n" +
            "Ржевская:\t" + spisok1St->at(num1).timeOtpr.toString() +
            "\nРижский вокзал:\t" + spisok2St->at(num2).timeOtpr.toString()).toStdString().c_str());
    return 0;
}
int ParseFiles::ParseLine(QString line, Elka& classEl) {
    if(line.isNull() || line.isEmpty()) return Error2("ParseFiles::ParseLine. Пустая строка.", FILEFUNKLINE);
    QStringList qstrl = line.split('\t');
    if(qstrl.size() > 0){
        if(qstrl.size() == 8){
            classEl.numPoezd = qstrl[0].toInt();
            classEl.stOtpr = qstrl[1];
            classEl.stNazn = qstrl[2];
            classEl.typePoezd= qstrl[3];
            classEl.timeOtpr = QTime::fromString(qstrl[4], "h:m");
            classEl.timePr = QTime::fromString(qstrl[5], "h:m");
            classEl.timeDv = QTime::fromString(qstrl[6], "m");
            classEl.Stoimost = qstrl[7].toInt();
        }
        else{
            return Error2("Размер списка не совпадает с необходимым!", FILEFUNKLINE);
        }
    }
    else {
        return Error2("Пустой список.", FILEFUNKLINE);
    }
    return 0;
}
